const gulp = require('gulp-help')(require('gulp')),
    _ = require('lodash'),
    notify = require('gulp-notify'),
    folderToc = require('folder-toc'),
    docco = require('gulp-docco'),
    connect = require('gulp-connect'),
    hb = require('gulp-hb'),
    frontMatter = require('gulp-front-matter'),
    rename = require('gulp-rename'),
    config = require('./config'),
    gutil = require('gulp-util'),
    webpack = require('webpack');
webpackConfig = require('./webpack.config'),
    fs = require('fs');

gulp.task('default', 'Auto-rebuild site on changes.', ['server', 'docs'], function () {
    gulp.watch(config.globs.other, ['static']);
    gulp.watch(_.flatten([
        config.globs.templates,
        config.globs.data,
        config.globs.helpers,
        config.globs.partials,
        config.globs.svg_sass
    ]), ['markup']);
    gulp.watch(_.flatten([
        config.globs.sass,
        config.globs.js
    ]), ['webpack']);
    gulp.watch(config.globs.js, ['docs']);
});

gulp.task('docs', 'Build documentation into ./docs directory.', ['docs:files'], function () {
    folderToc('./docs', {
        filter: '*.html'
    });
});

gulp.task('docs:files', false, function () {
    return gulp.src(config.globs.js)
        .pipe(docco())
        .pipe(gulp.dest('./docs'));
});

gulp.task('server', 'Start development server.', ['build'], function () {
    gulp.watch(config.buildPath('**/*'), function (file) {
        return gulp.src(file.path).pipe(connect.reload());
    });

    return connect.server({
        root: config.buildRoot,
        livereload: true
    });
});

gulp.task('build', 'Build site into ./build directory.', ['static', 'webpack', 'markup']);

gulp.task('static', 'Build static files into ./build directory.', function () {
    return gulp.src(config.globs.other, {base: './src'})
        .pipe(gulp.dest(config.buildRoot));
});

gulp.task('markup', 'Build markup into ./build directory.', ['webpack'], function () {
    var hbStream = hb({
        data: config.globs.data,
        helpers: config.globs.helpers,
        partials: config.globs.partials,
        parsePartialName: function (option, file) {
            return _.last(file.path.split(/\\|\//)).replace('.hbs', '');
        },
        bustCache: true
    });
    hbStream.partials({
        svg_styles: fs.readFileSync(config.buildRoot + '/css/svg.css').toString()
    });
    if (process.env.GA_PROP) {
        hbStream.data({
            'gaPropertyId': process.env.GA_PROP
        });
    }
    if (process.env.SENTRY_KEY) {
        hbStream.data({
            'sentryKey': process.env.SENTRY_KEY
        });
    }
    return gulp.src(config.globs.templates)
        .pipe(frontMatter())
        .pipe(hbStream)
        .on('error', notify.onError())
        .pipe(rename({extname: '.html'}))
        .pipe(gulp.dest(config.buildRoot));
});

gulp.task('webpack', 'Build JS & CSS into ./build directory.', function (callback) {
    webpack(webpackConfig, function (err, stats) {
        if (err) {
            throw new gutil.PluginError('webpack', err);
        }
        gutil.log('[webpack]', stats.toString());
        callback();
    });
});
